
package org.sql.commands.mysql.command;

// *************************************************************************/
// Charada Soft
// Area de Desarrollo de Sistemas de Información
// *************************************************************************/
// Proyecto : java connector sql 
// Archivo : ExecuteCommand.java
// Descripcion : Clase ExecuteCommand
// *************************************************************************/
// Version : 1.0.5
// Fecha de Creación: 01 de Julio de 2014
// Author : Daniel Andres Castillo Pedroza
// *************************************************************************/

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import org.sql.commands.exception.DMLException;

public class ExecuteCommand {
    
    // Atributos estáticos de la clase ExecuteCommand
    
    private static PreparedStatement prepared;
    
    //<editor-fold defaultstate="collapsed" desc="'Metodos para Sentencia Insert'">
    
    /**
      * Este método nos permite ejecutar el Comando DML 'Insert'. Donde
      * el comando se establece con un objeto <code>Insert</code> y sus
      * datos con un objeto <code>ArrayList</code>.
      * @param insert Objeto que contiene el Comando a ejecutar
      * @param datos Datos para establecer en el Comando
      * @param connection Conexión establecida con el Servidor de Base de Datos
      * @return Retorna el resultado en un dato <code>boolean</code>.
      * @throws SQLException Se lanzara esta excepción si hay un error al
      *  tratar de ejecutar el comando en el Método.
      * @throws DMLException Se lanzara esta excepción si hay un error al
      *  configurar el comando a ejecutar en el Método.
    */
    
    public static boolean executeInsert(Insert insert, ArrayList datos, Connection connection) throws SQLException, DMLException {
      // Declarando y configurando datos para el Proceso
      prepared = connection.prepareStatement(insert.getCommand());
      int index = 1; // Dato para asignar index del objeto
      
      // Cargando los datos de la Sentencia
      for (Object object : datos) {
        prepared.setObject(index,object); 
        index++; // Incrementado dato de Control del Index
      } // Recorriendo Array de datos para el Comando
      
      // Ejecutando comando configurado
      boolean result = prepared.execute(); prepared.close();
      
      return result; // Retornando el Resultado del Comando
    }
    
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="'Metodos para Sentencia Select'">
    
    /**
      * Este método nos permite ejecutar el Comando DML 'Select'. Donde
      * el comando se establece con un objeto <code>Select</code>.
      * @param select Objeto que contiene el Comando a ejecutar
      * @param connection Conexión establecida con el Servidor de Base de Datos
      * @return Retorna el resultado en un objeto <code>ResultSet</code>.
      * @throws SQLException Se lanzara esta excepción si hay un error al
      *  tratar de ejecutar el comando en el Método.
      * @throws DMLException Se lanzara esta excepción si hay un error al
      *  configurar el comando a ejecutar en el Método.
    */
    
    public static ResultSet executeSelect(Select select, Connection connection) throws SQLException, DMLException {
      // Declarando y configurando datos para el Proceso
      prepared = connection.prepareStatement(select.getCommand());
      
      // Ejecutando comando configurado
      ResultSet resultSet = prepared.executeQuery(); 
      
      return resultSet; // Retornando el Resultado del Comando
    }
    
    /**
      * Este método nos permite ejecutar el Comando DML 'Select'. Donde
      * el comando se establece con un objeto <code>Select</code> y sus
      * datos con un objeto <code>String</code>.
      * @param select Objeto que contiene el Comando a ejecutar
      * @param dato Dato de Filtro para realizar el Select
      * @param connection Conexión establecida con el Servidor de Base de Datos
      * @return Retorna el resultado en un objeto <code>ResultSet</code>.
      * @throws SQLException Se lanzara esta excepción si hay un error al
      *  tratar de ejecutar el comando en el Método.
      * @throws DMLException Se lanzara esta excepción si hay un error al
      *  configurar el comando a ejecutar en el Método.
    */
    
    public static ResultSet executeSelect(Select select, String dato, Connection connection) throws SQLException, DMLException {
      // Declarando y configurando datos para el Proceso
      prepared = connection.prepareStatement(select.getCommand());
      
      prepared.setString(1,dato); // Estableciendo dato de Consulta
      
      // Ejecutando comando configurado
      ResultSet resultSet = prepared.executeQuery(); 
      
      return resultSet; // Retornando el Resultado del Comando
    }
    
    /**
      * Este método nos permite ejecutar el Comando DML 'Select'. Donde
      * el comando se establece con un objeto <code>Select</code> y sus
      * datos con un objeto <code>ArrayList</code>.
      * @param select Objeto que contiene el Comando a ejecutar
      * @param datos Datos para establecer en el Comando
      * @param connection Conexión establecida con el Servidor de Base de Datos
      * @return Retorna el resultado en un objeto <code>ResultSet</code>.
      * @throws SQLException Se lanzara esta excepción si hay un error al
      *  tratar de ejecutar el comando en el Método.
      * @throws DMLException Se lanzara esta excepción si hay un error al
      *  configurar el comando a ejecutar en el Método.
    */
    
    public static ResultSet executeSelect(Select select, ArrayList datos, Connection connection) throws SQLException, DMLException {
      // Declarando y configurando datos para el Proceso
      prepared = connection.prepareStatement(select.getCommand());
      int index = 1; // Dato para asignar index del objeto
      
      // Cargando los datos de la Sentencia
      for (Object object : datos) {
        prepared.setObject(index,object); 
        index++; // Incrementado dato de Control del Index
      } // Recorriendo Array de datos para el Comando
      
      // Ejecutando comando configurado
      ResultSet resultSet = prepared.executeQuery(); 
      
      return resultSet; // Retornando el Resultado del Comando
    }
    
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="'Metodos para Sentencia Update'">
    
    /**
      * Este método nos permite ejecutar el Comando DML 'Update'. Donde
      * el comando se establece con un objeto <code>Update</code> y sus
      * datos con un objeto <code>ArrayList</code>.
      * @param update Objeto que contiene el Comando a ejecutar
      * @param datos Datos para establecer en el Comando
      * @param connection Conexión establecida con el Servidor de Base de Datos
      * @return Retorna el resultado en un dato <code>int</code>.
      * @throws SQLException Se lanzara esta excepción si hay un error al
      *  tratar de ejecutar el comando en el Método.
      * @throws DMLException Se lanzara esta excepción si hay un error al
      *  configurar el comando a ejecutar en el Método.
    */
    
    public static int executeUpdate(Update update, ArrayList datos, Connection connection) throws SQLException, DMLException {
      // Declarando y configurando datos para el Proceso
      prepared = connection.prepareStatement(update.getCommand());
      int index = 1; // Dato para asignar index del objeto
      
      // Cargando los datos de la Sentencia
      for (Object object : datos) {
        prepared.setObject(index,object); 
        index++; // Incrementado dato de Control del Index
      } // Recorriendo Array de datos para el Comando
      
      // Ejecutando comando configurado
      int result = prepared.executeUpdate(); prepared.close();
      
      return result; // Retornando el Resultado del Comando
    }
    
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="'Metodos para Sentencia Delete'">
    
    /**
      * Este método nos permite ejecutar el Comando DML 'Delete'. Donde
      * el comando se establece con un objeto <code>Delete</code>.
      * @param delete Objeto que contiene el Comando a ejecutar
      * @param connection Conexión establecida con el Servidor de Base de Datos
      * @return Retorna el resultado en un dato <code>int</code>.
      * @throws SQLException Se lanzara esta excepción si hay un error al
      *  tratar de ejecutar el comando en el Método.
      * @throws DMLException Se lanzara esta excepción si hay un error al
      *  configurar el comando a ejecutar en el Método.
    */
    
    public static int executeDelete(Delete delete, Connection connection) throws SQLException, DMLException {
      // Declarando y configurando datos para el Proceso
      prepared = connection.prepareStatement(delete.getCommand());
      
      // Ejecutando comando configurado
      int result = prepared.executeUpdate(); prepared.close();
      
      return result; // Retornando el Resultado del Comando
    }
    
    /**
      * Este método nos permite ejecutar el Comando DML 'Delete'. Donde
      * el comando se establece con un objeto <code>Delete</code> y sus
      * datos con un objeto <code>String</code>.
      * @param delete Objeto que contiene el Comando a ejecutar
      * @param dato Dato de Filtro para realizar el Delete
      * @param connection Conexión establecida con el Servidor de Base de Datos
      * @return Retorna el resultado en un dato <code>int</code>.
      * @throws SQLException Se lanzara esta excepción si hay un error al
      *  tratar de ejecutar el comando en el Método.
      * @throws DMLException Se lanzara esta excepción si hay un error al
      *  configurar el comando a ejecutar en el Método.
    */
    
    public static int executeDelete(Delete delete, String dato, Connection connection) throws SQLException, DMLException {
      // Declarando y configurando datos para el Proceso
      prepared = connection.prepareStatement(delete.getCommand());
      
      prepared.setString(1,dato); // Estableciendo dato de Eliminación
      
      // Ejecutando comando configurado
      int result = prepared.executeUpdate(); prepared.close();
      
      return result; // Retornando el Resultado del Comando
    }
    
    /**
      * Este método nos permite ejecutar el Comando DML 'Delete'. Donde
      * el comando se establece con un objeto <code>Delete</code> y sus
      * datos con un objeto <code>ArrayList</code>.
      * @param delete Objeto que contiene el Comando a ejecutar
      * @param datos Datos para establecer en el Comando
      * @param connection Conexión establecida con el Servidor de Base de Datos
      * @return Retorna el resultado en un dato <code>int</code>.
      * @throws SQLException Se lanzara esta excepción si hay un error al
      *  tratar de ejecutar el comando en el Método.
      * @throws DMLException Se lanzara esta excepción si hay un error al
      *  configurar el comando a ejecutar en el Método.
    */
    
    public static int executeDelete(Delete delete, ArrayList datos, Connection connection) throws SQLException, DMLException {
      // Declarando y configurando datos para el Proceso
      prepared = connection.prepareStatement(delete.getCommand());
      int index = 1; // Dato para asignar index del objeto
      
      // Cargando los datos de la Sentencia
      for (Object object : datos) {
        prepared.setObject(index,object); 
        index++; // Incrementado dato de Control del Index
      } // Recorriendo Array de datos para el Comando
      
      // Ejecutando comando configurado
      int result = prepared.executeUpdate(); prepared.close();
      
      return result; // Retornando el Resultado del Comando
    }
    
    //</editor-fold>
    
    /**
      * Este método nos permite cerrar el PreparedStatement cuando se
      * halla procesado un Comando. Se recomienda ejecutar este metodo
      * despues de haber ejecutado un 'executeSelect'.
      * @throws SQLException Se lanzara esta excepción si hay un error al
      *  tratar de cerrar el PreparedStatement comando en el Método.
    */
    
    public static void closedPrepared() throws SQLException {
      if (!prepared.isClosed()) {
        prepared.close();
      } // El estatuto no esta Cerradon en el Servidor
    }
}